package 前缀和;

/**
 * @PackageName: 前缀和
 * @ClassName: LeetCode303
 * @Author: chen jinxu
 * @Date: 2022/7/23 12:08
 * 给定一个整数数组 nums，处理以下类型的多个查询:
 *
 * 计算索引left和right（包含 left 和 right）之间的 nums 元素的和,其中left <= right
 * 实现 NumArray 类：
 *
 * NumArray(int[] nums) 使用数组 nums 初始化对象
 * int sumRange(int i, int j) 返回数组 nums中索引left和right之间的元素的 总和 ，包含left和right两点
 * （也就是nums[left] + nums[left + 1] + ... + nums[right])
 * 来源：力扣（LeetCode）
 * 链接：https://leetcode.cn/problems/range-sum-query-immutable
 * 著作权归领扣网络所有。商业转载请联系官方授权，非商业转载请注明出处。
 * 输入：
 * ["NumArray", "sumRange", "sumRange", "sumRange"]
 * [[[-2, 0, 3, -5, 2, -1]], [0, 2], [2, 5], [0, 5]]
 * 输出：
 * [null, 1, -1, -3]
 * 解释：
 * NumArray numArray = new NumArray([-2, 0, 3, -5, 2, -1]);
 * numArray.sumRange(0, 2); // return 1 ((-2) + 0 + 3)
 * numArray.sumRange(2, 5); // return -1 (3 + (-5) + 2 + (-1))
 * numArray.sumRange(0, 5); // return -3 ((-2) + 0 + 3 + (-5) + 2 + (-1))
 */
public class LeetCode303 {
    public static void main(String[] args) {
        int[] nums = {-2, 0, 3, -5, 2, -1};
        LeetCode303 obj = new LeetCode303(nums);
        System.out.println(obj.sumRange(0,2));
        System.out.println(obj.sumRange(2,5));
        System.out.println(obj.sumRange(0,5));
    }
    private int[] preSums;
    public LeetCode303(int[] nums) {
        preSums = new int[nums.length];
        preSums[0] = nums[0];
        for (int i = 1; i < nums.length; i++) {
            preSums[i] += preSums[i - 1] + nums[i];
        }
    }

    public int sumRange(int left, int right) {
        int result = 0;
        if (left > 0) {
            result = preSums[right] - preSums[left - 1];
        } else {
            result = preSums[right];
        }
        return result;
    }
}
